perm filename TEMP.TEM[TEX,ALS] blob
sn#596768 filedate 1981-07-02 generic text, type C, neo UTF8
COMMENT ā VALID 00003 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 PROCEDURE CHECKMEM(PRINTLOCS:BOOLEAN)
C00005 00003 FUNCTION GETNODE(SIZE: INTEGER):
C00010 ENDMK
Cā;
PROCEDURE CHECKMEM(PRINTLOCS:BOOLEAN);
LABEL 0, 1;
VAR P,I: INTEGER;
BEGIN
FOR I:=0 TO 49151 DO FREE[I]:=FALSE;
P:=MEM[49152].TWOHALVES.LHWORD;
WHILE P<>0 DO
BEGIN
IF(MEM[P].TWOHALVES.LHWORD>=49152)
OR FREE[P] OR((MEM[P].TWOHALVES.LHWORD<>0)
AND(MEM[P].TWOHALVES.LHWORD<=25000)) THEN
BEGIN PRINTLN(134); (* AVAIL LIST CLOBBERED AT *)
PRINTINT(P);
GOTO 0;
END;
FREE[P]:=TRUE;
P:=MEM[P].TWOHALVES.LHWORD;
END;
0:
P:=ROVER;
REPEAT
IF(P>=25000) OR(P<=0) OR(NOT(MEM[P].TWOHALVES.RHWORD=65535))
OR(P+MEM[P+1].TWOHALVES.RHWORD>25000)
OR(MEM[P+1].TWOHALVES.RHWORD<2)
OR(MEM[MEM[P].TWOHALVES.LHWORD+1].TWOHALVES.LHWORD<>P) THEN
BEGIN
PRINTLN(135); (* DOUBLE AVAIL LIST CLOBBERED AT *)
PRINTINT(P);
PRINTLN(136); (* TYP *)
PRINTINT(MEM[P].TWOHALVES.BYTE2);
PRINTLN(137); (* NODESIZE *)
PRINTINT(MEM[P+1].TWOHALVES.RHWORD);
PRINTLN(138); (* RLINK *)
PRINTINT(MEM[P].TWOHALVES.LHWORD);
PRINTLN(139); (* LLLINK OF RLINK *)
PRINTINT(MEM[MEM[P].TWOHALVES.LHWORD+1].TWOHALVES.LHWORD);
GOTO 1;
END;
FOR I:=P TO(P+MEM[P+1].TWOHALVES.RHWORD-1) DO
BEGIN IF FREE[I] THEN
BEGIN
PRINTLN(140); (* DOUBLE FREE LOCATION AT *)
PRINTINT(I);
GOTO 1;
END;
FREE[I]:=TRUE
END;
P:=MEM[P].TWOHALVES.LHWORD
UNTIL P=ROVER;
1:
IF PRINTLOCS THEN
BEGIN I:=0;
WHILE I<25000 DO
BEGIN IF(MEM[I].TWOHALVES.RHWORD=65535) THEN
BEGIN
PRINTLN(141); (* NODE *)
PRINTINT(I);
PRINT(142); (* IS FREE SIZE *)
PRINTINT(MEM[I+1].TWOHALVES.RHWORD);
END;
I:=I+1;
WHILE(I<25000) AND(NOT FREE[I])
DO I:=I+1
END;
PRINTLN(143); (* NEW BUSY LOCS *)
END;
FOR I:=0 TO 49151 DO
BEGIN
IF WASFREE[I] AND(NOT FREE[I]) AND PRINTLOCS THEN
PRINTINT(I);
WASFREE[I]:=FREE[I]
END
END;
FUNCTION GETNODE(SIZE: INTEGER):
INTEGER;
LABEL 0, 1;
VAR P:INTEGER;
Q:INTEGER;
S: INTEGER;
BEGIN
P:= ROVER; (*Points to double available list*)
REPEAT
BEGIN
Q:=P+MEM[P+1].TWOHALVES.RHWORD;
WHILE(MEM[Q].TWOHALVES.RHWORD=65535) DO
BEGIN
IF(Q=ROVER) THEN
BEGIN
ROVER:=MEM[Q].TWOHALVES.LHWORD;
IF(Q=ROVER) THEN GOTO 0
END;
MEM[MEM[Q].TWOHALVES.LHWORD+1].TWOHALVES.LHWORD:=
MEM[Q+1].TWOHALVES.LHWORD;
MEM[MEM[Q+1].TWOHALVES.LHWORD].TWOHALVES.LHWORD:=
MEM[Q].TWOHALVES.LHWORD;
MEM[Q].TWOHALVES.RHWORD:=0;
Q:=Q+MEM[Q+1].TWOHALVES.RHWORD
END;
S:=Q-P;
IF S>=SIZE+2 THEN
BEGIN
Q:=Q-SIZE;
MEM[P+1].TWOHALVES.RHWORD:=Q-P;
ROVER:=P;
GOTO 1
END;
IF S=SIZE THEN
BEGIN
IF(P=ROVER) THEN
BEGIN
ROVER:=MEM[P].TWOHALVES.LHWORD;
IF(P=ROVER) THEN GOTO 0
END;
MEM[MEM[P].TWOHALVES.LHWORD+1].TWOHALVES.LHWORD:=
MEM[P+1].TWOHALVES.LHWORD;
MEM[MEM[P+1].TWOHALVES.LHWORD].TWOHALVES.LHWORD:=
MEM[P].TWOHALVES.LHWORD;
MEM[P].TWOHALVES.RHWORD:=0;
ROVER:=MEM[P].TWOHALVES.LHWORD;
Q:=P;
GOTO 1
END;
MEM[P+1].TWOHALVES.RHWORD:=S;
P:=MEM[P].TWOHALVES.LHWORD
END;
UNTIL P=ROVER;
0:
OVERFLOW(132,25000);
1:
WITH MEM[Q].TWOHALVES DO
BEGIN RHWORD:=0;
LHWORD:=0 END;
MEM[Q+1].TWOHALVES.LHWORD:=0;
GETNODE:=Q;(* VARUSED:=VARUSED+SIZE;*)
END;
PROCEDURE FREENODE(P,SIZE: INTEGER);
VAR Q:INTEGER;
BEGIN
Q:=MEM[ROVER+1].TWOHALVES.LHWORD;
MEM[P+1].TWOHALVES.LHWORD:=Q;
MEM[P].TWOHALVES.LHWORD:=ROVER;
MEM[P+1].TWOHALVES.RHWORD:=SIZE;
MEM[P].TWOHALVES.RHWORD:=65535;
MEM[ROVER+1].TWOHALVES.LHWORD:=P;
MEM[Q].TWOHALVES.LHWORD:=P;(*
VARUSED:=VARUSED-SIZE;*)
END;
FUNCTION GETAVAIL: INTEGER;
VAR P: INTEGER;
BEGIN
P:=MEM[49152].TWOHALVES.LHWORD;
IF P<>0 THEN MEM[49152].TWOHALVES
.LHWORD:=MEM[MEM[49152].TWOHALVES.LHWORD].TWOHALVES.LHWORD
ELSE OVERFLOW(133,49152);
MEM[P].TWOHALVES.LHWORD:=0;
GETAVAIL:=P;(* DYNUSED:=DYNUSED+1;*)
END;
PROCEDURE FREEAVAIL(P: INTEGER);
BEGIN
IF P<25012 THEN FREENODE(P,2)
ELSE BEGIN MEM[P].TWOHALVES.LHWORD:=MEM[49152].TWOHALVES.LHWORD;
MEM[49152].TWOHALVES.LHWORD:=P;(*
DYNUSED:=DYNUSED-1;*)
END
END;
PROCEDURE DSLIST(P: INTEGER);
VAR Q:INTEGER;
BEGIN
WHILE P<>0 DO
BEGIN Q:=MEM[P].TWOHALVES.LHWORD;
FREEAVAIL(P);
P:=Q
END
END;
PROCEDURE DELRCLINK(P: INTEGER);
BEGIN
IF MEM[P].TWOHALVES.RHWORD>0 THEN
MEM[P].TWOHALVES.RHWORD:=MEM[P].TWOHALVES.RHWORD-1
ELSE DSLIST(P)
END;
PROCEDURE DELGLUELINK(P: INTEGER);
BEGIN
IF MEM[P].TWOHALVES.RHWORD>0 THEN
MEM[P].TWOHALVES.RHWORD:=MEM[P].TWOHALVES.RHWORD-1
ELSE FREENODE(P,4)
END;